from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)


class Config(object):
    SQLALCHEMY_DATABASE_URI = 'mysql://root:@127.0.0.1:3306/test'
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_ECHO = True
app.config.from_object(Config)

db = SQLAlchemy(app)

class User(db.Model):
    __tablename__ = 'user'

    id = db.Column('id', db.Integer, primary_key=True, doc='用户ID')
    name = db.Column('name', db.String, doc='姓名')
    age = db.Column('age', db.Integer, doc='年龄')


"""添加
db.session.add(user)
db.session.add_all([user1, user2]) #添加多条
"""
@app.route('/add')
def add():
    user = User(name="王五", age=13)
    db.session.add(user)
    db.session.commit()
    return "add";

"""查询

方式1：
User.query.all()  # 查询所有
User.query.first() # 查询一条
User.query.get(2) # 根据主键ID获取独享, 主键不存在返回None
方式2:
db.session.query(User).all()
db.session.query(User).first()
db.session.query(User).get(2)

# filter
User.query.filter_by(name='张三').first()
User.query.filter_by(name='张三', age=11).first()  # and关系
User.query.filter(User.name=='张三').first()
# 或
from sqlalchemy import or_
User.query.filter(or_(User.name=='张三', User.name.endswith('四'))).all()
# 与
from sqlalchemy import and_
User.query.filter(and_(User.name != '张三', User.age.startswith(1))).all()
# 逻辑非
from sqlalchemy import not_
User.query.filter(not_(User.name == '张三')).all()

#offset 偏移，起始位置
User.query.offset(2).all()

#limit  获取限制数据
User.query.limit(3).all()

#order_by
User.query.order_by(User.id).all()  # 正序
User.query.order_by(User.id.desc()).all()  # 倒序

# 复合查询
User.query.filter(User.name.startswith('13')).order_by(User.id.desc()).offset(2).limit(5).all()

# 优化查询
from sqlalchemy.orm import load_only
User.query.options(load_only(User.name, User.mobile)).filter_by(id=1).first() # 查询特定字段

#聚合查询
db.session.query(Relation.user_id, func.count(Relation.target_user_id)).filter(Relation.relation == Relation.RELATION.FOLLOW).group_by(Relation.user_id).all()



"""
@app.route('/')
def index():
    #res = User.query.all()
    res = User.query.first()
    print(res)
    return 'ok'


if __name__ == '__main__':
    app.run(debug=True)


